#!/bin/sh
#
# Copyright (C) 2011 Nick Schermer <nick@xfce.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

# appearance-install-theme <theme-package>
# return value:
# 1: common error, should never happen
# 2: File too big
# 3: Failed to create temp directory
# 4: Failed to extract archive
# 5: Unknown file format
# theme-package can be a tar-file zip-file or a directory
# the following themes types are supported:
# - Gtk-2
# - Gtk-3
# - Xfwm
# - Icons

dndfilename="$1"
retval=0

installtheme()
{
    file="$1"
    suffix="$2"

    basedir=${file#$tmpdir/}
    themedir=${basedir%/$suffix}
    themename=${3:-`basename "$themedir"`}
    themetype=`dirname "$suffix"`
    themesrc=`dirname "$basedir"`
    src="$tmpdir/$themesrc"

    dest="$HOME/.themes/$themename"
    if test ! -d "$dest/$themetype"; then
        # move theme to the users' theme directory
        mkdir -p "$dest" && mv "$src" "$dest"
    fi
}

installicontheme()
{
    file="$1"
    suffix="$2"

    basedir=${file#$tmpdir/}
    themedir=${basedir%/$suffix}
    themename=${3:-`basename "$themedir"`}
    src="$tmpdir/$themedir"

    dest="$HOME/.icons"
    if test ! -d "$dest/$themename"; then
        # move theme to the users' theme directory
        mkdir -p "$dest" && mv "$src" "$dest"
    fi
}

detectthemes()
{
    suffix="$1"

    if test -f "$tmpdir/$suffix"; then
        installtheme "$tmpdir/$suffix" "$suffix" "$pkgname"
    fi
    find "$tmpdir" -path "$tmpdir/*/$suffix" -type f | while read file; do
        installtheme "$file" "$suffix"
    done
}

# leave if no file is provided
if test -z "$dndfilename" -o -z "$HOME"; then
    # 1: common error, should never happen
    exit 1
fi

# check file size, abort if bigger then 50Mb, only works for files
if test x"`which stat 2>/dev/null`" != x""; then
    if [ "`uname -s`" = "DragonFly" ] || [ "`uname -s`" = "FreeBSD" ] || [ "`uname -s`" = "NetBSD" ] || [ "`uname -s`" = "OpenBSD" ]; then
        dndsize=`stat -f %z "$dndfilename"`
    else
        dndsize=`stat -c %s "$dndfilename"`
    fi
    if test "$dndsize" -gt 52428800; then
        # 2: File too big
        exit 2
    fi
fi

# provide tempdir to extract the tarball or folder
# we try $XDG_CACHE_HOME because it is more likely this is on the
# same partition, so moving the theme after extract is faster
if test x"`which mktemp 2>/dev/null`" != x""; then
    TMPDIR="${TMPDIR:-/tmp}"
    tmpdir=`TMPDIR="${XDG_CACHE_HOME:-$TMPDIR}" mktemp -d`
else
    tmpdir="/tmp/tmp.$$.$RANDOM"
    mkdir "$tmpdir"
fi
if test ! -d "$tmpdir"; then
    # 3: Failed to create temp directory
    exit 3
fi

# check if uri is directory or file
if test -d "$dndfilename"; then
    cp -r "$dndfilename" "$tmpdir" || retval=1
    pkgname=`basename "$dndfilename"`
elif test -f "$dndfilename"; then
    case "$dndfilename" in
        *.tar.gz|*.tar.Z|*.tgz|*.tar.bz2|*.tbz2|*.tbz|*.tar|*.tar.xz|*.txz)
            # extract the archive
            tar -C "$tmpdir" -xf "$dndfilename" || retval=4
            pkgname=`basename "${dndfilename%.*}" .tar`
        ;;
        *.zip)
            # extract the archive
            unzip -qq -d "$tmpdir" "$dndfilename" || retval=4
            pkgname=`basename "$dndfilename" .zip`
        ;;
        *)
            # 5: unknow file format
            retval=5
        ;;
    esac
fi

# detect theme type and move it to the correct location if
# extracting or copying succeeded
if test "$retval" -eq 0; then
    # install gtk-2.0 themes
    detectthemes "gtk-2.0/gtkrc"

    # install gtk-3.0 themes
    detectthemes "gtk-3.0/gtk.css"

    # install xfwm4 themes
    detectthemes "xfwm4/themerc"

    # install icon themes
    suffix="index.theme"
    section="Icon Theme"
    if test -f "$tmpdir/$suffix"; then
        if grep -q -i "^\\[$section\\]" "$tmpdir/$suffix"; then
            installicontheme "$tmpdir/$suffix" "$suffix" "$pkgname"
        fi
    fi
    find "$tmpdir" -path "$tmpdir/*/$suffix" -type f | while read file; do
        if grep -q -i "^\\[$section\\]" "$file"; then
            installicontheme "$file" "$suffix"
        fi
    done
fi

# cleanup
rm -rf "$tmpdir"

exit $retval
